<?php

if (!defined('BASEPATH'))
  exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package		CodeIgniter
 * @author		ExpressionEngine Dev Team
 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license		http://codeigniter.com/user_guide/license.html
 * @link		http://codeigniter.com
 * @since		Version 1.0
 * @filesource
 */
// ------------------------------------------------------------------------

/**
 * CodeIgniter Config Class
 *
 * This class contains functions that enable config files to be managed
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Libraries
 * @author		ExpressionEngine Dev Team
 * @link		http://codeigniter.com/user_guide/libraries/config.html
 */
class CI_Config {

  /**
   * List of all loaded config values
   *
   * @var array
   */
  var $config = array();

  /**
   * List of all loaded config files
   *
   * @var array
   */
  var $is_loaded = array();

  /**
   * List of paths to search when trying to load a config file
   *
   * @var array
   */
  var $_config_paths = array(APPPATH);

  /**
   * Constructor
   *
   * Sets the $config data from the primary config.php file as a class variable
   *
   * @access   public
   * @param   string	the config file name
   * @param   boolean  if configuration values should be loaded into their own section
   * @param   boolean  true if errors should just return false, false if an error message should be displayed
   * @return  boolean  if the file was successfully loaded or not
   */
  function __construct() {
    $this->config = & get_config();
    log_message('debug', "Config Class Initialized");

    // Set the base_url automatically if none was provided
    if ($this->config['base_url'] == '') {
      if (isset($_SERVER['HTTP_HOST'])) {
        $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
        $base_url .= '://' . $_SERVER['HTTP_HOST'];
        $base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
      } else {
        $base_url = 'http://localhost/';
      }

      $this->set_item('base_url', $base_url);
    }
  }

  // --------------------------------------------------------------------

  /**
   * Load Config File
   *
   * @access	public
   * @param	string	the config file name
   * @param   boolean  if configuration values should be loaded into their own section
   * @param   boolean  true if errors should just return false, false if an error message should be displayed
   * @return	boolean	if the file was loaded correctly
   */
  function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) {
    $file = ($file == '') ? 'config' : str_replace('.php', '', $file);
    $found = FALSE;
    $loaded = FALSE;

    $check_locations = defined('ENVIRONMENT') ? array(ENVIRONMENT . '/' . $file, $file) : array($file);

    foreach ($this->_config_paths as $path) {
      foreach ($check_locations as $location) {
        $file_path = $path . 'config/' . $location . '.php';

        if (in_array($file_path, $this->is_loaded, TRUE)) {
          $loaded = TRUE;
          continue 2;
        }

        if (file_exists($file_path)) {
          $found = TRUE;
          break;
        }
      }

      if ($found === FALSE) {
        continue;
      }

      include($file_path);

      if (!isset($config) OR ! is_array($config)) {
        if ($fail_gracefully === TRUE) {
          return FALSE;
        }
        show_error('Your ' . $file_path . ' file does not appear to contain a valid configuration array.');
      }

      if ($use_sections === TRUE) {
        if (isset($this->config[$file])) {
          $this->config[$file] = array_merge($this->config[$file], $config);
        } else {
          $this->config[$file] = $config;
        }
      } else {
        $this->config = array_merge($this->config, $config);
      }

      $this->is_loaded[] = $file_path;
      unset($config);

      $loaded = TRUE;
      log_message('debug', 'Config file loaded: ' . $file_path);
      break;
    }

    if ($loaded === FALSE) {
      if ($fail_gracefully === TRUE) {
        return FALSE;
      }
      show_error('The configuration file ' . $file . '.php does not exist.');
    }

    return TRUE;
  }

  // --------------------------------------------------------------------

  /**
   * Fetch a config file item
   *
   *
   * @access	public
   * @param	string	the config item name
   * @param	string	the index name
   * @param	bool
   * @return	string
   */
  function item($item, $index = '') {
    if ($index == '') {
      if (!isset($this->config[$item])) {
        return FALSE;
      }

      $pref = $this->config[$item];
    } else {
      if (!isset($this->config[$index])) {
        return FALSE;
      }

      if (!isset($this->config[$index][$item])) {
        return FALSE;
      }

      $pref = $this->config[$index][$item];
    }

    return $pref;
  }

  // --------------------------------------------------------------------

  /**
   * Fetch a config file item - adds slash after item (if item is not empty)
   *
   * @access	public
   * @param	string	the config item name
   * @param	bool
   * @return	string
   */
  function slash_item($item) {
    if (!isset($this->config[$item])) {
      return FALSE;
    }
    if (trim($this->config[$item]) == '') {
      return '';
    }

    return rtrim($this->config[$item], '/') . '/';
  }

  // --------------------------------------------------------------------

  /**
   * Site URL
   * Returns base_url . index_page [. uri_string]
   *
   * @access	public
   * @param	string	the URI string
   * @return	string
   */
  function site_url($uri = '') {
    if ($uri == '') {
      return $this->slash_item('base_url') . $this->item('index_page');
    }

    if ($this->item('enable_query_strings') == FALSE) {
      $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix');
      return $this->slash_item('base_url') . $this->slash_item('index_page') . $this->_uri_string($uri) . $suffix;
    } else {
      return $this->slash_item('base_url') . $this->item('index_page') . '?' . $this->_uri_string($uri);
    }
  }

  // -------------------------------------------------------------

  /**
   * Base URL
   * Returns base_url [. uri_string]
   *
   * @access public
   * @param string $uri
   * @return string
   */
  function base_url($uri = '') {
    return $this->slash_item('base_url') . ltrim($this->_uri_string($uri), '/');
  }

  // -------------------------------------------------------------

  /**
   * Build URI string for use in Config::site_url() and Config::base_url()
   *
   * @access protected
   * @param  $uri
   * @return string
   */
  protected function _uri_string($uri) {
    if ($this->item('enable_query_strings') == FALSE) {
      if (is_array($uri)) {
        $uri = implode('/', $uri);
      }
      $uri = trim($uri, '/');
    } else {
      if (is_array($uri)) {
        $i = 0;
        $str = '';
        foreach ($uri as $key => $val) {
          $prefix = ($i == 0) ? '' : '&';
          $str .= $prefix . $key . '=' . $val;
          $i++;
        }
        $uri = $str;
      }
    }
    return $uri;
  }

  // --------------------------------------------------------------------

  /**
   * System URL
   *
   * @access	public
   * @return	string
   */
  function system_url() {
    $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH));
    return $this->slash_item('base_url') . end($x) . '/';
  }

  // --------------------------------------------------------------------

  /**
   * Set a config file item
   *
   * @access	public
   * @param	string	the config item key
   * @param	string	the config item value
   * @return	void
   */
  function set_item($item, $value) {
    $this->config[$item] = $value;
  }

  // --------------------------------------------------------------------

  /**
   * Assign to Config
   *
   * This function is called by the front controller (CodeIgniter.php)
   * after the Config class is instantiated.  It permits config items
   * to be assigned or overriden by variables contained in the index.php file
   *
   * @access	private
   * @param	array
   * @return	void
   */
  function _assign_to_config($items = array()) {
    if (is_array($items)) {
      foreach ($items as $key => $val) {
        $this->set_item($key, $val);
      }
    }
  }

}

// END CI_Config class

/* End of file Config.php */
/* Location: ./system/core/Config.php */
